Performance problems are common in software projects. Profiling is a form of software analysis that measures operational characteristics of the software. While traditional profilers have been effective tools in the well-defined testing environment of the debugging stage, many performance bugs survive this review process and cause inconvenience and frustration to end-users. The complexity of diverse and interdependent software layers, which are integrated and updated separately in the deployment, makes complete testing and containment of performance bugs a challenge.
Most profilers embed profiling code into the source code of a software project under test. Although source code may be available during the debugging stage, it is hard to use such tools after debugging due to the fact that much software is distributed in binary formats. Dynamic translators are popularly used in the research community for convenience of instrumentation, and some profiling tools are based on them. These tools can transparently insert profiling instructions into software without need for the source code. However, the overhead of such tools is high, again making them suitable only for the debugging stage.